#pragma once

#include <memory>
#include "instructions/base/instructions.h"
#include "rtda/frame.h"

namespace jvm {
namespace instructions {

// Float conversions
class F2D : public NoOperandsInstruction {
public: void execute(std::shared_ptr<rtda::Frame> frame) override;
};
class F2I : public NoOperandsInstruction {
public: void execute(std::shared_ptr<rtda::Frame> frame) override;
};
class F2L : public NoOperandsInstruction {
public: void execute(std::shared_ptr<rtda::Frame> frame) override;
};

// Integer conversions
class I2B : public NoOperandsInstruction {
public: void execute(std::shared_ptr<rtda::Frame> frame) override;
};
class I2C : public NoOperandsInstruction {
public: void execute(std::shared_ptr<rtda::Frame> frame) override;
};
class I2S : public NoOperandsInstruction {
public: void execute(std::shared_ptr<rtda::Frame> frame) override;
};
class I2L : public NoOperandsInstruction {
public: void execute(std::shared_ptr<rtda::Frame> frame) override;
};
class I2F : public NoOperandsInstruction {
public: void execute(std::shared_ptr<rtda::Frame> frame) override;
};
class I2D : public NoOperandsInstruction {
public: void execute(std::shared_ptr<rtda::Frame> frame) override;
};

// Long conversions
class L2D : public NoOperandsInstruction {
public: void execute(std::shared_ptr<rtda::Frame> frame) override;
};
class L2F : public NoOperandsInstruction {
public: void execute(std::shared_ptr<rtda::Frame> frame) override;
};
class L2I : public NoOperandsInstruction {
public: void execute(std::shared_ptr<rtda::Frame> frame) override;
};

// Double conversions
class D2F : public NoOperandsInstruction {
public: void execute(std::shared_ptr<rtda::Frame> frame) override;
};
class D2I : public NoOperandsInstruction {
public: void execute(std::shared_ptr<rtda::Frame> frame) override;
};
class D2L : public NoOperandsInstruction {
public: void execute(std::shared_ptr<rtda::Frame> frame) override;
};

} // namespace instructions
} // namespace jvm